package nancal.mp.mvc.devops

import nancal.mp.db.mongo.mor
import nancal.mp.extend.toBjTime
import nancal.mp.model.git.GitBranchCommitModel
import nancal.mp.mvc.ops.OpsGitController
import nbcp.base.annotation.Require
import nbcp.base.comm.ListResult
import nbcp.base.extend.HasValue
import nbcp.base.extend.must
import nbcp.myoql.db.mongo.queryById
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import javax.servlet.http.HttpServletRequest

@RequestMapping("/dev/git")
@RestController
class GitController {
    companion object {
        private val logger = LoggerFactory.getLogger(this::class.java.declaringClass)
    }

    @Autowired
    lateinit var gitClient: OpsGitController

//    data class QueryModel(
//        var git_id: String = "",
//        var folder: String = "",
//        var env_name: String = ""
//    ) {
//
//        var git_branch: String = ""
//            get() {
//                if (field.contains(",")) {
//                    return field.split(",").sortedBy { it.length }.first()
//                }
//                return field;
//            }
//            set(v) {
//                if (v.contains(",")) {
//                    field = v.split(",").sortedBy { it.length }.first()
//                    return;
//                }
//                field = v
//            }
//    }


//    @PostMapping("/nginx/name")
//    fun nginx_name(
//        @org.springframework.web.bind.annotation.RequestBody query: QueryModel,
//        request: HttpServletRequest
//    ): ApiResult<String> {
//        var gitData = mor.dev.gitData.queryById(query.git_id).toEntity();
//        if (gitData == null) {
//            return ApiResult.error("找不到 git 数据")
//        }
//
//        var gitServer = mor.dev.gitServer.queryById(gitData.server.id).toEntity();
//        if (gitServer == null) {
//            return ApiResult.error("找不到 git 服务器")
//        }
//
//        var gitItems = gitData.path
//            .replace(".git", "", false)
//            .trim('/')
//            .split("/")
//
//
//        var env_file_prefix = (if (query.folder.isEmpty()) "" else query.folder + "/") + ".env."
//        var content = gitClient.getFile(
//            gitServer.id,
//            gitItems[0],
//            gitItems[1],
//            query.git_branch,
//            env_file_prefix + query.env_name
//        )
//
//        if (content.code == 404) {
//            content = gitClient.getFile(
//                gitServer.id,
//                gitItems[0],
//                gitItems[1],
//                query.git_branch,
//                env_file_prefix + "k8s"
//            );
//        }
//
//        if (content.data == null) {
//            return ApiResult.error("找不到 .env. 配置文件")
//        }
//
//        var item = content.data!!.split("\n").map {
//            it.trim().replace("\r", "")
//        }.firstOrNull { it.startsWith("VUE_APP_Nginx_VPath_Name=") };
//
//        if (item == null) {
//            return ApiResult.of("/")
//        }
//
//        return ApiResult.of(item.split("=").last().trim())
//    }

    @PostMapping("/branch/list")
    fun branches(
        @Require gitId: String,
        request: HttpServletRequest
    ): ListResult<GitBranchCommitModel> {
        var gitData = mor.dev.gitData.queryById(gitId).toEntity()
            .must()
            .elseThrow { "找不到git数据" }


        var gitItems = gitData.path
            .replace(".git", "", false)
            .trim('/')
            .split("/")

        if (gitItems.size < 2) {
            throw RuntimeException("gitData.path,非法，${gitData.path}")
        }

//        logger.Important("=================")
//        logger.Important(gitData.id)
//        logger.Important("=================")
//        var b = gitClient.getBranches2(gitData.id)
//        logger.Important(b);

        var list = gitClient.getBranches(
            gitData.id,
            36
        )
            .apply {
                if (this.msg.HasValue) {
                    return this
                }
            }
            .data
            .sortedByDescending { it.commitAt }

        list.forEach {
            it.commitAt = it.commitAt?.toBjTime()
        }

        //合并相同分支
        list = list.groupBy { it.commitId }.map {
            var v = it.value.first();
            v.name = it.value.map { it.name }.sortedBy { it.length }.joinToString(",")
            return@map v
        }

        return ListResult.of(list)
    }

}
